/**
 * elancom Corporation copy right 2012 - 2015  
 *   
 * $Header: https://192.168.1.224/svn/elancom/product/elancom-platform/trunk/src/main/java/com/elancom/framework/dao/GenericDAO.java 1034 2012-07-02 03:09:12Z lanzhouxue $
 * $Id: GenericDAO.java 1034 2012-07-02 03:09:12Z lanzhouxue $
 * $Author: lanzhouxue $
 * $Date: 2012-07-02 11:09:12 +0800 (周一, 02 七月 2012) $
 * $Revision: 1034 $
 */
package com.elancom.framework.dao;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.elancom.framework.dao.expression.Condition;
import com.elancom.framework.entity.AbstractEntity;

/**
 * DAO公共接口,依赖Hibernate了
 * 
 * @author elancom
 * @date May 3, 2012
 */
public interface GenericDAO<M extends AbstractEntity> {
	/**
	 * 统计记录
	 * 
	 * @return
	 */
	int count();

	/**
	 * @param condition
	 * @return
	 */
	int count(Condition condition);

	/**
	 * 健必须为实体对象的属性名
	 * 
	 * @param conditionMap
	 *            条件
	 * @return
	 */
	int count(Map<String, Object> conditionMap);

	/**
	 * @param select
	 * @return
	 */
	int count(SelectCompiled select);

	/**
	 * 条件统计记录
	 * 
	 * @param condition
	 *            条件语句
	 * @return
	 */
	int count(String condition);

	/**
	 * @param condition
	 *            条件语句
	 * @param paramMap
	 *            条件参数
	 * @return
	 */
	int count(String condition, Map<String, Object> paramMap);

	/**
	 * 按ID查询实体
	 * 
	 * @param id
	 * @return
	 */
	M getById(String id);

	/**
	 * 通过ID查询列表
	 * 
	 * @param ids
	 *            id之间使用','分割
	 * @return
	 */
	List<M> getByIds(String ids);

	/**
	 * 通过ID查询列表
	 * 
	 * @param ids
	 * @return
	 */
	List<M> getByIds(String[] ids);

	/**
	 * 查询所有记录
	 * 
	 * @return
	 */
	List<M> selectList();

	/**
	 * @param condition
	 * @return
	 */
	List<M> selectList(Condition condition);

	/**
	 * @param condition
	 * @param Limit
	 * @return
	 */
	Result selectList(Condition condition, int curPage, int pageSize);

	/**
	 * 分页查询记录
	 * 
	 * @param Limit
	 * @return
	 */
	Result selectList(int curPage, int pageSize);

	/**
	 * 条件查询
	 * 
	 * @param condition
	 *            条件MAP
	 * @return
	 */
	List<M> selectList(Map<String, Object> condition);

	/**
	 * 条件分页查询记录
	 * 
	 * @param condition
	 *            条件MAP
	 * @param Limit
	 *            分页对象
	 * @return
	 */
	Result selectList(Map<String, Object> condition, int curPage, int pageSize);

	/**
	 * 批量保存数据
	 * 
	 * @param entity
	 */
	void insert(Collection<M> entity);

	/**
	 * 保存数据
	 * 
	 * @param entity
	 */
	void insert(M entity);

	/**
	 * 批量保存数据
	 * 
	 * @param entityMap
	 */
	void insert(Map<Object, M> entityMap);

	/**
	 * 通过ID判断记录是否存在
	 * 
	 * @param id
	 * @return
	 */
	boolean isExist(String id);

	/**
	 * 尽力懒加载一个实体
	 * 
	 * @param id
	 * @return
	 */
	M loadById(String id);

	/**
	 * 批量删除实体
	 * 
	 * @param entities
	 */
	void remove(Collection<M> entities);

	/**
	 * 删除实体
	 * 
	 * @param entity
	 */
	void remove(M entity);

	/**
	 * 按ID删除实体
	 * 
	 * @param id
	 */
	void remove(String id);

	/**
	 * 批量更新实体
	 * 
	 * @param entities
	 */
	void update(Collection<M> entities);

	/**
	 * 更新实体
	 * 
	 * @param entity
	 */
	void update(M entity);

	/**
	 * @param update
	 * @return
	 */
	int update(UpdateCompiled update);

	/**
	 * @param select
	 * @return
	 */
	 Result select(SelectCompiled select);
}
